package com.example.design.b.proxy2.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 代理类构造器
 */
public class ProxyBuilder<T> {

    /**
     * 构建代理对象
     *
     * @param obj 被代理的对象
     *
     * @return 被代理后的对象
     */
    @SuppressWarnings("unchecked")
    public T build(T obj) {
        // 方法处理器对象
        InvocationHandler handler = new CommonInvocationHandler(obj);

        // 类加载器
        ClassLoader classLoader = ClassLoader.getSystemClassLoader();

        // 被代理类实现的接口
//        Class<?>[] interfaces = {IPerson.class};
        // 或者这样直接获取被代理类实现的所有接口
        Class<?>[] interfaces = obj.getClass().getInterfaces();

        // 该方法自JDK9开始废弃
        // Class<?> proxyClass = Proxy.getProxyClass(IPerson.class.getClassLoader(), IPerson.class);
        // return (IPerson) proxyClass.getConstructor(InvocationHandler.class).newInstance(handler);

        return (T) Proxy.newProxyInstance(classLoader, interfaces, handler);
    }
}
